#include "stdafx.h"

#include "Mask.h"

const Mask pxsimple_surface_tables[][17] = {
    {// dir = 0
        // M1
        Mask( BV( BP(7,2,0), BP(7,2,2), BP(7,0,0) ), BV( BP(0,2,0), BP(0,2,2), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        Mask( BV( BP(7,7,7), BP(2,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        // M2
        Mask( BV( BP(7,7,7), BP(0,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        Mask( BV( BP(7,0,0), BP(7,2,2), BP(7,0,0) ), BV( BP(0,0,0), BP(0,2,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        // M3
        Mask( BV( BP(2,2,0), BP(2,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,7,2), BP(0,2,0) ) ),
        // M4
        Mask( BV( BP(2,3,0), BP(3,6,2), BP(0,2,0) ), BV( BP(0,0,0), BP(1,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,6,0), BP(6,3,2), BP(0,2,0) ), BV( BP(0,0,0), BP(4,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,6,0), BP(6,3,2), BP(0,2,0) ), BV( BP(0,4,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,3,0), BP(3,6,2), BP(0,2,0) ), BV( BP(0,1,0), BP(0,6,2), BP(0,2,0) ) ),
        // M5
        Mask( BV( BP(2,3,0), BP(3,6,2), BP(0,2,0) ), BV( BP(0,1,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,6,0), BP(6,3,2), BP(0,2,0) ), BV( BP(0,4,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,6,0), BP(6,3,2), BP(0,2,0) ), BV( BP(0,0,0), BP(4,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,3,0), BP(3,6,2), BP(0,2,0) ), BV( BP(0,0,0), BP(1,6,2), BP(0,2,0) ) ),
        // M6
        Mask( BV( BP(3,3,0), BP(2,6,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(6,6,0), BP(2,3,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(6,2,0), BP(6,3,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(3,2,0), BP(3,6,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,6,2), BP(0,2,0) ) ),
    },
    {// dir = 1
        // M1
        Mask( BV( BP(0,0,7), BP(2,3,7), BP(0,0,7) ), BV( BP(0,0,0), BP(2,3,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        Mask( BV( BP(1,1,1), BP(1,7,3), BP(1,1,1) ), BV( BP(0,0,0), BP(0,6,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        // M2
        Mask( BV( BP(1,1,1), BP(1,7,1), BP(1,1,1) ), BV( BP(0,0,0), BP(0,6,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,0,7), BP(2,2,7), BP(0,0,7) ), BV( BP(0,0,0), BP(2,2,0), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        // M3
        Mask( BV( BP(0,2,0), BP(2,7,3), BP(0,2,0) ), BV( BP(0,2,0), BP(2,6,0), BP(0,2,0) ) ),
        // M4
        Mask( BV( BP(0,1,2), BP(2,7,3), BP(0,2,0) ), BV( BP(0,0,2), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,3), BP(0,1,2) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,2) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,3), BP(0,1,2) ), BV( BP(0,2,0), BP(2,6,0), BP(0,1,0) ) ),
        Mask( BV( BP(0,1,2), BP(2,7,3), BP(0,2,0) ), BV( BP(0,1,0), BP(2,6,0), BP(0,2,0) ) ),
        // M5
        Mask( BV( BP(0,1,2), BP(2,7,3), BP(0,2,0) ), BV( BP(0,1,0), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,3), BP(0,1,2) ), BV( BP(0,2,0), BP(2,6,0), BP(0,1,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,3), BP(0,1,2) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,2) ) ),
        Mask( BV( BP(0,1,2), BP(2,7,3), BP(0,2,0) ), BV( BP(0,0,2), BP(2,6,0), BP(0,2,0) ) ),
        // M6
        Mask( BV( BP(0,1,1), BP(2,7,3), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,3), BP(0,1,1) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,3), BP(0,0,3) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,0,3), BP(2,7,3), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,0), BP(0,2,0) ) ),
    },
    {// dir = 2
        // M1
        Mask( BV( BP(4,4,4), BP(4,7,4), BP(4,6,4) ), BV( BP(0,0,0), BP(0,3,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(0,6,0), BP(7,7,7) ), BV( BP(0,2,0), BP(0,6,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        // M2
        Mask( BV( BP(0,2,0), BP(0,2,0), BP(7,7,7) ), BV( BP(0,2,0), BP(0,2,0), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        Mask( BV( BP(4,4,4), BP(4,7,4), BP(4,4,4) ), BV( BP(0,0,0), BP(0,3,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        // M3
        Mask( BV( BP(0,2,0), BP(2,7,2), BP(0,6,0) ), BV( BP(0,2,0), BP(2,3,2), BP(0,0,0) ) ),
        // M4
        Mask( BV( BP(0,2,0), BP(2,7,4), BP(0,6,2) ), BV( BP(0,2,0), BP(2,3,4), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(4,7,2), BP(2,6,0) ), BV( BP(0,2,0), BP(4,3,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(4,7,2), BP(2,6,0) ), BV( BP(0,2,0), BP(0,3,2), BP(2,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,4), BP(0,6,2) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,2) ) ),
        // M5
        Mask( BV( BP(0,2,0), BP(2,7,4), BP(0,6,2) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,2) ) ),
        Mask( BV( BP(0,2,0), BP(4,7,2), BP(2,6,0) ), BV( BP(0,2,0), BP(0,3,2), BP(2,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(4,7,2), BP(2,6,0) ), BV( BP(0,2,0), BP(4,3,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,4), BP(0,6,2) ), BV( BP(0,2,0), BP(2,3,4), BP(0,0,0) ) ),
        // M6
        Mask( BV( BP(0,2,0), BP(2,7,0), BP(0,6,6) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(0,7,2), BP(6,6,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(4,7,2), BP(4,6,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,4), BP(0,6,4) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,0) ) ),
    },
    {// dir = 3
        // M1
        Mask( BV( BP(7,0,0), BP(7,3,2), BP(7,0,0) ), BV( BP(0,0,0), BP(0,3,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        Mask( BV( BP(1,1,1), BP(3,7,1), BP(1,1,1) ), BV( BP(0,0,0), BP(2,6,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        // M2
        Mask( BV( BP(1,1,1), BP(1,7,1), BP(1,1,1) ), BV( BP(0,0,0), BP(0,6,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        Mask( BV( BP(7,0,0), BP(7,2,2), BP(7,0,0) ), BV( BP(0,0,0), BP(0,2,2), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        // M3
        Mask( BV( BP(0,2,0), BP(3,7,2), BP(0,2,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,2,0) ) ),
        // M4
        Mask( BV( BP(0,2,0), BP(3,7,2), BP(2,1,0) ), BV( BP(0,2,0), BP(0,6,2), BP(2,0,0) ) ),
        Mask( BV( BP(2,1,0), BP(3,7,2), BP(0,2,0) ), BV( BP(2,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,1,0), BP(3,7,2), BP(0,2,0) ), BV( BP(0,1,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(3,7,2), BP(2,1,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,1,0) ) ),
        // M5
        Mask( BV( BP(0,2,0), BP(3,7,2), BP(2,1,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,1,0) ) ),
        Mask( BV( BP(2,1,0), BP(3,7,2), BP(0,2,0) ), BV( BP(0,1,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,1,0), BP(3,7,2), BP(0,2,0) ), BV( BP(2,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(3,7,2), BP(2,1,0) ), BV( BP(0,2,0), BP(0,6,2), BP(2,0,0) ) ),
        // M6
        Mask( BV( BP(0,2,0), BP(3,7,2), BP(1,1,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,0,0) ) ),
        Mask( BV( BP(1,1,0), BP(3,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(3,0,0), BP(3,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(3,7,2), BP(3,0,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,0,0) ) ),
    },
    {// dir = 4
        // M1
        Mask( BV( BP(4,6,4), BP(4,7,4), BP(4,4,4) ), BV( BP(0,2,0), BP(0,3,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        Mask( BV( BP(7,7,7), BP(0,6,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,6,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        // M2
        Mask( BV( BP(7,7,7), BP(0,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        Mask( BV( BP(4,4,4), BP(4,7,4), BP(4,4,4) ), BV( BP(0,0,0), BP(0,3,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        // M3
        Mask( BV( BP(0,6,0), BP(2,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,2), BP(0,2,0) ) ),
        // M4
        Mask( BV( BP(2,6,0), BP(4,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(4,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,6,2), BP(2,7,4), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,4), BP(0,2,0) ) ),
        Mask( BV( BP(0,6,2), BP(2,7,4), BP(0,2,0) ), BV( BP(0,0,2), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(2,6,0), BP(4,7,2), BP(0,2,0) ), BV( BP(2,0,0), BP(0,3,2), BP(0,2,0) ) ),
        // M5
        Mask( BV( BP(2,6,0), BP(4,7,2), BP(0,2,0) ), BV( BP(2,0,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,6,2), BP(2,7,4), BP(0,2,0) ), BV( BP(0,0,2), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,6,2), BP(2,7,4), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,4), BP(0,2,0) ) ),
        Mask( BV( BP(2,6,0), BP(4,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(4,3,2), BP(0,2,0) ) ),
        // M6
        Mask( BV( BP(6,6,0), BP(0,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,6,6), BP(2,7,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,6,4), BP(2,7,4), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(4,6,0), BP(4,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,3,2), BP(0,2,0) ) ),
    },
    {// dir = 5
        // M1
        Mask( BV( BP(0,0,7), BP(2,2,7), BP(0,2,7) ), BV( BP(0,0,0), BP(2,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(0,2,2), BP(7,7,7) ), BV( BP(0,2,0), BP(0,2,2), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        // M2
        Mask( BV( BP(0,2,0), BP(0,2,0), BP(7,7,7) ), BV( BP(0,2,0), BP(0,2,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,0,7), BP(2,2,7), BP(0,0,7) ), BV( BP(0,0,0), BP(2,2,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        // M3
        Mask( BV( BP(0,2,0), BP(2,7,2), BP(0,2,2) ), BV( BP(0,2,0), BP(2,7,0), BP(0,0,0) ) ),
        // M4
        Mask( BV( BP(0,2,0), BP(2,6,3), BP(0,3,2) ), BV( BP(0,2,0), BP(2,6,1), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,3,6), BP(0,6,2) ), BV( BP(0,2,0), BP(2,3,4), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,3,6), BP(0,6,2) ), BV( BP(0,2,0), BP(2,3,0), BP(0,4,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,6,3), BP(0,3,2) ), BV( BP(0,2,0), BP(2,6,0), BP(0,1,0) ) ),
        // M5
        Mask( BV( BP(0,2,0), BP(2,6,3), BP(0,3,2) ), BV( BP(0,2,0), BP(2,6,0), BP(0,1,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,3,6), BP(0,6,2) ), BV( BP(0,2,0), BP(2,3,0), BP(0,4,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,3,6), BP(0,6,2) ), BV( BP(0,2,0), BP(2,3,4), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,6,3), BP(0,3,2) ), BV( BP(0,2,0), BP(2,6,1), BP(0,0,0) ) ),
        // M6
        Mask( BV( BP(0,2,0), BP(2,6,2), BP(0,3,3) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,3,2), BP(0,6,6) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,3,6), BP(0,2,6) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,6,3), BP(0,2,3) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,0) ) ),
    },
    {// dir = 6
        // M1
        Mask( BV( BP(7,0,0), BP(7,6,2), BP(7,0,0) ), BV( BP(0,0,0), BP(0,6,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        Mask( BV( BP(4,4,4), BP(6,7,4), BP(4,4,4) ), BV( BP(0,0,0), BP(2,3,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        // M2
        Mask( BV( BP(4,4,4), BP(4,7,4), BP(4,4,4) ), BV( BP(0,0,0), BP(0,3,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        Mask( BV( BP(7,0,0), BP(7,2,2), BP(7,0,0) ), BV( BP(0,0,0), BP(0,2,2), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        // M3
        Mask( BV( BP(0,2,0), BP(6,7,2), BP(0,2,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,2,0) ) ),
        // M4
        Mask( BV( BP(2,4,0), BP(6,7,2), BP(0,2,0) ), BV( BP(2,0,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,7,2), BP(2,4,0) ), BV( BP(0,2,0), BP(0,3,2), BP(2,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,7,2), BP(2,4,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,4,0) ) ),
        Mask( BV( BP(2,4,0), BP(6,7,2), BP(0,2,0) ), BV( BP(0,4,0), BP(0,3,2), BP(0,2,0) ) ),
        // M5
        Mask( BV( BP(2,4,0), BP(6,7,2), BP(0,2,0) ), BV( BP(0,4,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,7,2), BP(2,4,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,4,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,7,2), BP(2,4,0) ), BV( BP(0,2,0), BP(0,3,2), BP(2,0,0) ) ),
        Mask( BV( BP(2,4,0), BP(6,7,2), BP(0,2,0) ), BV( BP(2,0,0), BP(0,3,2), BP(0,2,0) ) ),
        // M6
        Mask( BV( BP(4,4,0), BP(6,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,3,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,7,2), BP(4,4,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,7,2), BP(6,0,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,0,0) ) ),
        Mask( BV( BP(6,0,0), BP(6,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,3,2), BP(0,2,0) ) ),
    },
    {// dir = 7
        // M1
        Mask( BV( BP(0,2,7), BP(2,2,7), BP(0,0,7) ), BV( BP(0,2,0), BP(2,2,0), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        Mask( BV( BP(7,7,7), BP(0,2,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,2,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        // M2
        Mask( BV( BP(7,7,7), BP(0,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,0,7), BP(2,2,7), BP(0,0,7) ), BV( BP(0,0,0), BP(2,2,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        // M3
        Mask( BV( BP(0,2,2), BP(2,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(2,7,0), BP(0,2,0) ) ),
        // M4
        Mask( BV( BP(0,6,2), BP(2,3,6), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,4), BP(0,2,0) ) ),
        Mask( BV( BP(0,3,2), BP(2,6,3), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,1), BP(0,2,0) ) ),
        Mask( BV( BP(0,3,2), BP(2,6,3), BP(0,2,0) ), BV( BP(0,1,0), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,6,2), BP(2,3,6), BP(0,2,0) ), BV( BP(0,4,0), BP(2,3,0), BP(0,2,0) ) ),
        // M5
        Mask( BV( BP(0,6,2), BP(2,3,6), BP(0,2,0) ), BV( BP(0,4,0), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,3,2), BP(2,6,3), BP(0,2,0) ), BV( BP(0,1,0), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,3,2), BP(2,6,3), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,1), BP(0,2,0) ) ),
        Mask( BV( BP(0,6,2), BP(2,3,6), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,4), BP(0,2,0) ) ),
        // M6
        Mask( BV( BP(0,6,6), BP(2,3,2), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,3,3), BP(2,6,2), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,3), BP(2,6,3), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,6), BP(2,3,6), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,0), BP(0,2,0) ) ),
    },
    {// dir = 8
        // M1
        Mask( BV( BP(1,1,1), BP(1,7,1), BP(1,3,1) ), BV( BP(0,0,0), BP(0,6,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(0,3,0), BP(7,7,7) ), BV( BP(0,2,0), BP(0,3,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        // M2
        Mask( BV( BP(0,2,0), BP(0,2,0), BP(7,7,7) ), BV( BP(0,2,0), BP(0,2,0), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        Mask( BV( BP(1,1,1), BP(1,7,1), BP(1,1,1) ), BV( BP(0,0,0), BP(0,6,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        // M3
        Mask( BV( BP(0,2,0), BP(2,7,2), BP(0,3,0) ), BV( BP(0,2,0), BP(2,6,2), BP(0,0,0) ) ),
        // M4
        Mask( BV( BP(0,2,0), BP(1,7,2), BP(2,3,0) ), BV( BP(0,2,0), BP(1,6,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,1), BP(0,3,2) ), BV( BP(0,2,0), BP(2,6,1), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,1), BP(0,3,2) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,2) ) ),
        Mask( BV( BP(0,2,0), BP(1,7,2), BP(2,3,0) ), BV( BP(0,2,0), BP(0,6,2), BP(2,0,0) ) ),
        // M5
        Mask( BV( BP(0,2,0), BP(1,7,2), BP(2,3,0) ), BV( BP(0,2,0), BP(0,6,2), BP(2,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,1), BP(0,3,2) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,2) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,1), BP(0,3,2) ), BV( BP(0,2,0), BP(2,6,1), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(1,7,2), BP(2,3,0) ), BV( BP(0,2,0), BP(1,6,2), BP(0,0,0) ) ),
        // M6
        Mask( BV( BP(0,2,0), BP(0,7,2), BP(3,3,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,0), BP(0,3,3) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,1), BP(0,3,1) ), BV( BP(0,2,0), BP(2,6,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(1,7,2), BP(1,3,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,0,0) ) ),
    },
    {// dir = 9
        // M1
        Mask( BV( BP(0,0,7), BP(2,6,7), BP(0,0,7) ), BV( BP(0,0,0), BP(2,6,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        Mask( BV( BP(4,4,4), BP(4,7,6), BP(4,4,4) ), BV( BP(0,0,0), BP(0,3,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        // M2
        Mask( BV( BP(4,4,4), BP(4,7,4), BP(4,4,4) ), BV( BP(0,0,0), BP(0,3,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,0,7), BP(2,2,7), BP(0,0,7) ), BV( BP(0,0,0), BP(2,2,0), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ) ),
        // M3
        Mask( BV( BP(0,2,0), BP(2,7,6), BP(0,2,0) ), BV( BP(0,2,0), BP(2,3,0), BP(0,2,0) ) ),
        // M4
        Mask( BV( BP(0,2,0), BP(2,7,6), BP(0,4,2) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,2) ) ),
        Mask( BV( BP(0,4,2), BP(2,7,6), BP(0,2,0) ), BV( BP(0,0,2), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,4,2), BP(2,7,6), BP(0,2,0) ), BV( BP(0,4,0), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,6), BP(0,4,2) ), BV( BP(0,2,0), BP(2,3,0), BP(0,4,0) ) ),
        // M5
        Mask( BV( BP(0,2,0), BP(2,7,6), BP(0,4,2) ), BV( BP(0,2,0), BP(2,3,0), BP(0,4,0) ) ),
        Mask( BV( BP(0,4,2), BP(2,7,6), BP(0,2,0) ), BV( BP(0,4,0), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,4,2), BP(2,7,6), BP(0,2,0) ), BV( BP(0,0,2), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,6), BP(0,4,2) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,2) ) ),
        // M6
        Mask( BV( BP(0,2,0), BP(2,7,6), BP(0,4,4) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,4,4), BP(2,7,6), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,0,6), BP(2,7,6), BP(0,2,0) ), BV( BP(0,0,0), BP(2,3,0), BP(0,2,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,7,6), BP(0,0,6) ), BV( BP(0,2,0), BP(2,3,0), BP(0,0,0) ) ),
    },
    {// dir = 10
        // M1
        Mask( BV( BP(1,3,1), BP(1,7,1), BP(1,1,1) ), BV( BP(0,2,0), BP(0,6,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        Mask( BV( BP(7,7,7), BP(0,3,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,3,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        // M2
        Mask( BV( BP(7,7,7), BP(0,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,2,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        Mask( BV( BP(1,1,1), BP(1,7,1), BP(1,1,1) ), BV( BP(0,0,0), BP(0,6,0), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ) ),
        // M3
        Mask( BV( BP(0,3,0), BP(2,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,2), BP(0,2,0) ) ),
        // M4
        Mask( BV( BP(0,3,2), BP(2,7,1), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,1), BP(0,2,0) ) ),
        Mask( BV( BP(2,3,0), BP(1,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(1,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,3,0), BP(1,7,2), BP(0,2,0) ), BV( BP(2,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,3,2), BP(2,7,1), BP(0,2,0) ), BV( BP(0,0,2), BP(2,6,0), BP(0,2,0) ) ),
        // M5
        Mask( BV( BP(0,3,2), BP(2,7,1), BP(0,2,0) ), BV( BP(0,0,2), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(2,3,0), BP(1,7,2), BP(0,2,0) ), BV( BP(2,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(2,3,0), BP(1,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(1,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,3,2), BP(2,7,1), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,1), BP(0,2,0) ) ),
        // M6
        Mask( BV( BP(0,3,3), BP(2,7,0), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,0), BP(0,2,0) ) ),
        Mask( BV( BP(3,3,0), BP(0,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(1,3,0), BP(1,7,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,6,2), BP(0,2,0) ) ),
        Mask( BV( BP(0,3,1), BP(2,7,1), BP(0,2,0) ), BV( BP(0,0,0), BP(2,6,0), BP(0,2,0) ) ),
    },
    {// dir = 11
        // M1
        Mask( BV( BP(7,0,0), BP(7,2,2), BP(7,2,0) ), BV( BP(0,0,0), BP(0,2,2), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,2,0), BP(7,7,7) ), BV( BP(0,2,0), BP(2,2,0), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        // M2
        Mask( BV( BP(0,2,0), BP(0,2,0), BP(7,7,7) ), BV( BP(0,2,0), BP(0,2,0), BP(0,0,0) ), BV( BP(0,0,0), BP(2,0,2), BP(0,0,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        Mask( BV( BP(7,0,0), BP(7,2,2), BP(7,0,0) ), BV( BP(0,0,0), BP(0,2,2), BP(0,0,0) ), BV( BP(0,2,0), BP(0,0,0), BP(0,2,0) ), BV( BP(0,0,0), BP(0,5,0), BP(0,0,0) ) ),
        // M3
        Mask( BV( BP(0,2,0), BP(2,7,2), BP(2,2,0) ), BV( BP(0,2,0), BP(0,7,2), BP(0,0,0) ) ),
        // M4
        Mask( BV( BP(0,2,0), BP(6,3,2), BP(2,6,0) ), BV( BP(0,2,0), BP(4,3,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(3,6,2), BP(2,3,0) ), BV( BP(0,2,0), BP(1,6,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(3,6,2), BP(2,3,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,1,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,3,2), BP(2,6,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,4,0) ) ),
        // M5
        Mask( BV( BP(0,2,0), BP(6,3,2), BP(2,6,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,4,0) ) ),
        Mask( BV( BP(0,2,0), BP(3,6,2), BP(2,3,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,1,0) ) ),
        Mask( BV( BP(0,2,0), BP(3,6,2), BP(2,3,0) ), BV( BP(0,2,0), BP(1,6,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,3,2), BP(2,6,0) ), BV( BP(0,2,0), BP(4,3,2), BP(0,0,0) ) ),
        // M6
        Mask( BV( BP(0,2,0), BP(2,3,2), BP(6,6,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(2,6,2), BP(3,3,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(3,6,2), BP(3,2,0) ), BV( BP(0,2,0), BP(0,6,2), BP(0,0,0) ) ),
        Mask( BV( BP(0,2,0), BP(6,3,2), BP(6,2,0) ), BV( BP(0,2,0), BP(0,3,2), BP(0,0,0) ) ),
    },
};
